
#ifndef _PLUGIN_VALUE_H_
#define _PLUGIN_VALUE_H_

#include <stdint.h>
#include <stdbool.h>
#include <stdarg.h>

class Value;

typedef enum
{
    VT_BOOL = 0,
    VT_CHAR,
    VT_STRING,
    VT_INT,
    VT_UINT,
    VT_DOUBLE,
    VT_POINT,

    VT_BOOL_ARRAY,
    VT_STRING_ARRAY,
    VT_INT_ARRAY,
    VT_UINT_ARRAY,
    VT_DOUBLE_ARRAY,
    VT_POINT_ARRAY,
    VT_VALUE_ARRAY,
} ValueType;

typedef union
{
    bool Bool;
    bool* BoolArray;

    char Char;
    char* String;
    char** StringArray;

    int32_t Int;
    int32_t* IntArray;

    uint32_t UInt;
    uint32_t* UIntArray;

    double Double;
    double* DoubleArray;

    void* Point;
    void** PointArray;

    Value* ValueArray;
} ValueContent;

class Value
{
public:
    Value();
    ~Value();
    Value(Value& v);
    void Copy(Value* v);

    Value(ValueType vt);
    Value(bool b);
    Value(int32_t num, bool* bArray);
    Value(int32_t num, bool b, ...);
    Value(char c);
    Value(char* str);
    Value(int32_t num, char** strArray);
    Value(int32_t num, char* str, ...);
    Value(int32_t i);
    Value(int32_t num, int32_t* iArray);
    Value(int32_t num, int32_t i, ...);
    Value(uint32_t ui);
    Value(int32_t num, uint32_t* uiArray);
    Value(int32_t num, uint32_t ui, ...);
    Value(double d);
    Value(int32_t num, double* fArray);
    Value(int32_t num, double d, ...);
    Value(void* p);
    Value(int32_t num, void** pArray);
    Value(int32_t num, void* p, ...);
    Value(int32_t num, ValueType* vtArray);
    Value(int32_t num, ValueType vt, ...);

    void Reset(bool b);
    void Reset(int32_t num, bool* bArray);
    void Reset(int32_t num, bool b, ...);
    void Reset(char c);
    void Reset(char* str);
    void Reset(int32_t num, char** strArray);
    void Reset(int32_t num, char* str, ...);
    void Reset(int32_t i);
    void Reset(int32_t num, int32_t* iArray);
    void Reset(int32_t num, int32_t i, ...);
    void Reset(uint32_t ui);
    void Reset(int32_t num, uint32_t* uiArray);
    void Reset(int32_t num, uint32_t ui, ...);
    void Reset(double d);
    void Reset(int32_t num, double* fArray);
    void Reset(int32_t num, double d, ...);
    void Reset(void* p);
    void Reset(int32_t num, void** pArray);
    void Reset(int32_t num, void* p, ...);
    void Reset(int32_t num, ValueType* vtArray);
    void Reset(int32_t num, ValueType vt, ...);

    bool& GetBool();
    bool* GetBoolArray();
    char& GetChar();
    char* GetString();
    char** GetStringArray();
    int32_t& GetInt();
    int32_t* GetIntArray();
    uint32_t& GetUInt();
    uint32_t* GetUIntArray();
    double& GetDouble();
    double* GetDoubleArray();
    void* GetPoint();
    void** GetPointArray();
    Value* GetValueArray();
    ValueContent GetContent();

    int32_t ArrayAdd(bool b);
    int32_t ArrayAdd(char* str);
    int32_t ArrayAdd(int32_t i);
    int32_t ArrayAdd(uint32_t ui);
    int32_t ArrayAdd(double d);
    int32_t ArrayAdd(void* p);
    int32_t ArrayAdd(Value* v);

    ValueType Type();

    //分隔符或单位符号(用于打印)
    char& Sep();
    //小数点或整数补零(用于打印)
    int32_t& Zero();
    //数据个数
    int32_t Num();

    //打印效果
    void Print(int32_t buffSize = 1024);
    void PrintJson(int32_t buffSize = 1024);
    //获取打印字符串,返回填写长度
    int32_t GetPrint(char* buff, int32_t buffSize);
    int32_t GetPrintJson(char* buff, int32_t buffSize);

    //清空数据
    void Clean();
    //转换为 VT_VALUE_ARRAY 类型
    void ToValueArray();

private:
    ValueType type = VT_BOOL;
    char sep = 0;
    int32_t zero = 0;
    int32_t num = 0;
    ValueContent content;
};

#endif // _PLUGIN_VALUE_H_
